﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class DelegateEx
    {
        /// <summary>
        /// 1、申明一个委托    
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        public delegate void CalculateDelegate(Int32 x, Int32 y);

        /// <summary>
        /// 2、创建与委托关联的方法，【二者具有相同的参数列表、返回值列表】  
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        public static void Add(Int32 x, Int32 y)
        {
            Console.WriteLine(x + y);
        }
        public static void Subtract(Int32 x, Int32 y)
        {
            Console.WriteLine(x - y);
        }
        public static void Multiply(Int32 x, Int32 y)
        {
            Console.WriteLine(x * y);
        }

        //3、申明委托类型变量
        public static CalculateDelegate myCalaulate;

        static void Main(string[] args)
        {
            #region 多播委托和委托链
            //  Console.WriteLine(Environment.NewLine);

            // 4、进行委托绑定( 也就是委托实现了 回调方法的签名,可以将方法当作参数传递，并根据传入的方法来动态改变方法调用)
            myCalaulate = new CalculateDelegate(Add);
            myCalaulate += new CalculateDelegate(Subtract);
            myCalaulate += new CalculateDelegate(Multiply);

            //5、回调委托链的各个方法
            myCalaulate(300, 100);

            #endregion
            Console.ReadKey();
        }

    }

}

